// go语言常量
package main

import (
	"fmt"
	"unsafe"
)

/**
 * const identifier [type] = value
 * const c_name1, c_name2 = value1, value2
 */
func t1() {
	const LENGTH int = 10
	const WIDTH int = 5
	var area int
	// 多重赋值
	const a, b, c = 1, false, "str"
	area = LENGTH * WIDTH
	fmt.Println(area)
	println()
	println(a, b, c)
}

/**
 * 常量用于枚举
 */
const (
	a = "abc"
	b = len(a)
	c = unsafe.Sizeof(a)
)
func t2() {
	println(a, b, c)
}

/**
 * iota，特殊常量，可以认为是一个可以被编译器修改的常量。
 * iota 在 const关键字出现时将被重置为 0(const 内部的
 * 第一行之前)，const 中每新增一行常量声明将使 iota 计
 * 数一次(iota 可理解为 const 语句块中的行索引)。
 */
func t3() {
	const (
		a = iota
		b
		c
		d = "ha"
		e
		f = 100
		g
		h = iota
		i
	)
	fmt.Println(a, b, c, d, e, f, g, h)
}

func t4() {
	const (
		i = 1 << iota
		j = 3 << iota
		k
		l
	)
	fmt.Println("i=", i)
	fmt.Println("j=", i)
	fmt.Println("k=", i)
	fmt.Println("l=", i)
}